package com.example.aidlservicedemo;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;

/**
 * 使用Messenger进行跨进程通信的服务端实现类
 * 该服务通过Messenger接收客户端消息并作出响应
 * 这里服务端Service是运行在单独的进程中的 android:process=":other"
 */
public class MessengerService extends Service {

    /**
     * 用于向客户端发送消息的Messenger对象
     * 通过绑定操作初始化后，客户端可以通过此对象与服务端交互
     */
    private Messenger mMessenger;

    @Override
    public IBinder onBind(Intent intent) {
        Log.i("MessengerService", "onBind~");
        // 使用IncomingHandler创建Messenger实例
        // IncomingHandler负责处理客户端发送的消息
        mMessenger = new Messenger(new IncomingHandler(getApplicationContext()));
        // 返回Messenger内部的IBinder对象
        // 客户端通过这个Binder实现远程调用
        return mMessenger.getBinder();
    }

    /**
     * 内部静态类，用于处理来自客户端的消息
     * 继承自Handler，重写handleMessage方法以定义消息处理逻辑
     */
    private static class IncomingHandler extends Handler {

        /**
         * 定义客户端发送"hello"消息时使用的what值
         * 用于在handleMessage中识别不同类型的请求
         */
        private static final int MSG_SAY_HELLO = 1;

        /**
         * 应用上下文，用于需要Context的操作（如显示Toast）
         * 使用ApplicationContext确保生命周期安全
         */
        private final Context applicationContext;

        /**
         * 构造函数
         *
         * @param context 上下文，用于获取ApplicationContext
         */
        IncomingHandler(Context context) {
            applicationContext = context.getApplicationContext();
        }

        @Override
        public void handleMessage(Message msg) {
            // 根据消息的what字段判断消息类型
            if (msg.what == 1) {
                Bundle data = msg.getData();
                data.setClassLoader(getClass().getClassLoader()); // 非常重要！
                Person person = data.getParcelable("person");

                Log.i("MessengerService", "接收到 Person: " + person.toString());

                // 回复客户端
                Messenger client = msg.replyTo;
                Message reply = Message.obtain(null, 2);
                Bundle replyData = new Bundle();
                replyData.putString("result", "你好 " + person.name);
                reply.setData(replyData);
                try {
                    client.send(reply);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}
